Motto: #Instant Visuell Getriggert

Bei der Entwicklung von Softwareprojekten werden eine Vielzahl unterschiedlicher Techniken und Programmiersprachen eingesetzt, um geforderte bzw. gewĂ¼nschte Funktionen zu realisieren. Verschiedene Faktoren, wie GrĂ¶ĂŸe, Budget usw. eines Softwareteams können zu einer unterschiedlichen Aufgabenverteilung innerhalb des Teams fĂ¼hren.

In diesem Notebook soll deshalb die Beziehung zwischen Entwicklern, Commits und Programmiersprachen anhand der Git-Historie von Softwareprojekten, speziell Datenbanken, untersucht werden. Hierbei soll im ersten Abschnitt insbesondere die Frage beantwortet werden, ob Entwickler auf eine Programmiersprache spezialisiert sind, oder vielmehr Aufgaben nach Bedarf erfĂ¼llen. Im zweiten Abschnitt werden zusätzlich zur Programmiersprache auch die Dateien und die Projektstruktur einbezogen. Dabei sollen die folgenden Fragen beantwortet werden:

Vorbereitung

Zu Beginn betrachten wir das Farbschema fĂ¼r die nachfolgenden Diagramme. Das Schema wurde zur besseren Verständlichkeit der Diagramme einheitlich gewählt:

Innerhalb dieses Notebooks werden speziell drei Datenbankengines im Detail betrachtet: MySQL, MongoDB und PostgreSQL. Zur besseren Verständlichkeit werden Graphen immer mit den zu den Datenbankengines zugehörigen Farben gezeichnet. Die Zuteilung ist im folgenden Diagramm zu sehen:

Laden der Daten

Die Git-Historien der einzelnen Datenbanken liegen als .csv Dateien vor. Diese werden geladen und anschlieĂŸend automatisch zur weiteren Benutzung vorbereitet. Dazu gehört unter anderem die Bereinigung sowie das Vorbereiten neuer Spalten. Um den Leser einen Ăœberblick Ă¼ber das Schema der Daten zu vermitteln, werden einige zufällige Einträge des erzeugten Dataframe gezeigt:

Es sind unter anderem wichtige Informationen zur Datenbank, dem entsprechenden Commit, dem Author und den gemachten Änderungen verhanden.

Die Git-Historien der folgenden Datenbanken wurden erfolgreich geladen:

##  [1] "Cassandra"     "Couchbase"     "CouchDB"       "Elasticsearch"
##  [5] "etcd"          "Firebird"      "Greenplum"     "Hazelcast"    
##  [9] "HBase"         "Hive"          "Impala"        "InfluxDB"     
## [13] "MariaDB"       "Memcached"     "MongoDB"       "MySQL"        
## [17] "Neo4j"         "PostgreSQL"    "Presto"        "Realm"        
## [21] "Redis"         "Solr"          "Spark SQL"     "Sphinx"       
## [25] "SQLite"

Ăœberblick Ă¼ber die geladenen Datenbankhistorien:

Es lässt sich schnell feststellen, dass die Meta-Informationen zu den Datenbanken stark varrieren.

Bei der Betrachtung des Ăœberblicks als Bubblechart liegen die meisten Datenbanken in der unteren, linken Ecke. Einige AusreiĂŸer sind zum Beispiel: MySQL, MariaDB und SparkSQL.

Rangfolge festlegen:

FĂ¼r die Entwickler und Programmiersprachen wird jeweils eine Rangliste erstellt und die x Entwickler/Programmiersprachen mit den meisten Ă„nderungen.

1. Verteilung Programmiersprachen

Damit Fragestellungen zum Verhältnis zwischen Entwicklern und Programmiersprachen beantwortet werden können, muss zuerst ein Ăœberblick Ă¼ber die in den verschiedenen Datenbankengines eingesetzten Programmiersprachen erstellt werden. Diese Fragestellung kann jedoch nicht mit den Rohdaten der Git-Historien beantwortet werden. Es sind lediglich die Dateipfade fĂ¼r jede Datei vorhanden. Aus den Pfaden können die Dateiendungen extrahiert werden und anhand dieser kann eine Programmiersprache zugewiesen werden. In den meisten Fällen funktioniert dieses Verfahren hervorragend. Problematisch sind Dateiendungen, welche von mehreren Programmiersprachen genutzt werden. Ein häufig auftretendes Beispiel sind die Programmiersprachen C und C++. Beide verwenden beispielsweise .h Dateiendungen. In diesem Fall ist eine eindeutige Zuweisung nicht möglich und es eine der Möglichkeiten zufällig ausgewählt werden. Da in einer C++-Datei auch C-Code stehen kann, mĂ¼sste eine Analyse der einzelnen Dateien stattfinden, um ein sicheres Ergebnis zu erhalten. FĂ¼r dieses Notebook und die betrachteten Fragestellungen reicht jedoch eine reines Zuweisung von Endung zu Programmiersprache aus.

Das folgende Diagramm zeigt den Anteil der eingesetzten Programmiersprachen je Projekt. Der Anteil wurde als prozentualer Anteil der veränderten Lines of Code im Verhältnis zur Gesamtanzahl der veränderten LOC (Lines of Code) berechnet. Es werden ingesamt 25 Datenbankengines betrachtet.

Es gilt zu beachten, dass nur die 8 am meisten verwendeten Sprachen (bestimmt anhand LOC) angezeigt werden. Die restlichen Programmiersprachen wurden unter ‘’other_pl’’ zusammengefasst.

Das oben gezeigte Diagramm lässt klar erkennen, dass fast jede Datenbank eine primär genutzte Programmiersprache besitzt. Oft beträgt der Anteil der am meisten genutzten Sprache Ă¼ber 75%. Stark verteten sind unter anderem C(Bsp: PostgreSQL, SQLite usw.) oder Java(Elasticsearch, Cassandra, Solr usw.). Weitere nennenswerte Primärsprachen sind Go(etcd, InfluxDB) und Scala(SparkSQL). In einigen Fällen bestehen Datenbanken aus einer Kombination von Sprachen. Couchbase sowie CouchDB sind beide zu groĂŸen Teilen in Erlang und Javascript geschrieben. Häufig ist auch die Kombination aus C++ und C vertreten. Wie oben beschrieben lässt sich nicht eindeutig feststellen, ob eine Datei nun in C, C++ oder als eine Mischung geschrieben ist. Trotzdem lässt sich eindeutig sagen, dass C und C++ einen groĂŸen Anteil an vielen der betrachteten Datenbanken ausmachen. Somit sind Java, C und C++ die am häufigsten vertretenen Programmiersprachen in den geladenenen Datenbanken.

Verschiedene Programmiersprachen wie Python, GCC Machine Description oder Shell bilden immer nur kleine Anteile einer Datenbankengine. Diese können bspw. fĂ¼r Schnittstellen der Datenbanken zu anderen Programmiersprachen oder als Hilfswerkzeuge genutzt worden sein.

1.1 Detaillierte Betrachtung dreier Datenbanken

Die Menge an verschiedenen Datenbanken ist zu hoch, um fĂ¼r jede eine detallierte Betrachtung anzufertigen. Aus diesem Grund werden stichprobenartig 3 Datenbanken ausgewählt, die detalliert betrachtet bzw. verglichen werden sollen. Bei interessanten Werten werden auch andere Datenbanken geplottet. Es wurden die folgenden Datenbanken ausgewählt:

## [1] "PostgreSQL" "MySQL"      "MongoDB"

Noch einmal der Ăœberblick Ă¼ber die Programmiersprachen je Datenbankengine fĂ¼r die drei gewählten Engines:

Alle 3 sind Ă¼berwiegend C bzw. C++ basiert. Dadurch lassen die Datenbanken sich besser vergleichen. Bei der hohen Anzahl an gemachten Ă„nderungen, ist es beachtlich, dass einige Entwickler fast 25% der gesamten Entwicklung beigetragen haben.

In den drei folgenden Diagrammen werden die einzelnen Anteile von den am meisten beitragenden Entwicklern pro Datenbank gezeigt.

Programmiersprachen pro Entwickler

Im folgenden Diagramm werden die Anteile der eingesetzten Programmiersprachen pro Entwickler betrachtet. Dabei werden die zwölf Entwickler mit den meisten Commits betrachtet.

MongoDB

MongoDB hat hauptsächlich C/C++ Entwickler mit den meisten Beiträgen. In Anbetracht der Anteile von C/C++ an MongoDB ist dies jedoch zu erwarten. Interessant ist jedoch, dass die restlichen Autoren wesentlich mehr in JavaScript beigetragen haben. ### Entwickler pro Programmiersprache fĂ¼r MongoDB

Hier wird nochmal deutlich, dass die Top-Entwickler den grĂ¶ĂŸten Anteil C/C++ stemmen, jedoch wenig Anteil an anderen Sprachen haben.

Detail-Ansicht interessante Autoren in MongoDB

PostgreSQL

PostgreSQL ist stark C lastig. Auch hier sind die Top-Entwickler stark mit C belegt.

Detail-Ansicht interessante Autoren in PostgreSQL

Auffällig ist hier die fast deckungsgleiche Fläche zwischen C und den restlichen Programmiersprachenanteilen.

MySQL

Die meisten Entwickler in MySQL sind C/C++ lastig. Auffällig sind hier jedoch zum einen ein Assembly Entwickler, zum anderen zwei Entwickler fĂ¼r Jasmin/JavaScript.

Entwickler pro Programmiersprache fĂ¼r MySQL

### Detail-Ansicht interessante Autoren in MySQL

## Entwicklung Anteil Programmiersprache Ă¼ber Zeit

Anteil Programmiersprache pro Commit

Im Folgenden ist ein Ausschnitt der Programmiersprachen-Verteilung Ă¼ber 50 zufällige Commits je Commit dargestellt. Hierbei wird der Anteil der Ă„nderungen in Lines of Code pro Commit in der zugehöriger Programmiersprache als Balkendiagramm gezeichnet.

Auffällig: GrĂ¶ĂŸtenteils 1 Sprache pro Commit.

Betrachtung der Dichte von Programmiersprache je Commit:

Ăœber alle Datenbanken hinweg:

## Hässliches Entlein:

2. Verteilung Programmierer - Bereiche in Dateien

##             name count_file
## 1  Elasticsearch      54590
## 2          Neo4j      50189
## 3        MongoDB      31544
## 4          MySQL      30870
## 5           Solr      25944
## 6      Hazelcast      20572
## 7        MariaDB      20326
## 8      Greenplum      20057
## 9           Hive      17591
## 10     Spark SQL      11733
## 11        Presto      11107
## 12         HBase      10683
## 13      InfluxDB       8447
## 14    PostgreSQL       5108
## 15     Cassandra       5107
## 16      Firebird       5069
## 17        Impala       3985
## 18       CouchDB       2748
## 19          etcd       2401
## 20     Couchbase       2307
## 21         Realm       1829
## 22         Redis        943
## 23        SQLite        650
## 24        Sphinx        265
## 25     Memcached        175

Hierarchie - Betrachtung der Dateien

## Weitere Ideen:

  • Matrix Plot (quasi heatmap) : wann treten Ă„nderungen auf Jahr x Monat
  • Treemap: Fill by Author
  • Timeline: erster Beitrag eines Autors